package cn.edu.fzu.homemaking.redis;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 这个标注用来为redis的<b>通用化</b>存取设定参数
 * 
 * @author fangxin
 * @date 2023/04/10
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Redis {

    /** 非null值 默认过期时间 **/
    int DEFAULT_TTL = 4 * 60 * 60 + 10 * 60;

    /** null值 默认过期时间 **/
    int NULL_TTL    = 5 * 60;

    /** redis key，见 {@link RedisKey} **/
    String value();


    /**
     * <pre>
     *  指示方法的哪些参数用来构造key，及其顺序(编号由0开始)
     *
     *  示例
     *      keyArgs = {1,0,2}，表示用方法的第二，第一，第三个参数，按顺序来构造key
     *
     *  默认值的意思是方法的前 n 个参数来构造key，n 最大为10
     *  这样如果构造 key 的参数不多于 10 个且顺序也和方法参数一致，则可以用默认值
     * </pre>
     */
    int[] keyArgs() default { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };


    /** 执行何种操作，默认是先访问 redis **/
    RedisAction action() default RedisAction.REDIS_FIRST;


    /** 过期时间，默认250分钟 **/
    int ttl() default DEFAULT_TTL;


    /** 是否要缓存 null 值，默认为true **/
    boolean cacheNull() default true;


    /** 如果要缓存null值，过期时间是多少，默认5分钟 **/
    int nullTtl() default NULL_TTL;
}
